// Copyright Epic Games, Inc. All Rights Reserved.

#include "MessageProcessors/ElimChainProcessor.h" // 包含头文件

#include "GameFramework/PlayerState.h" // 包含玩家状态类
#include "Messages/LyraVerbMessage.h" // 包含Lyra动词消息结构体
#include "NativeGameplayTags.h" // 包含原生游戏标签定义

#include UE_INLINE_GENERATED_CPP_BY_NAME(ElimChainProcessor) // 包含由Unreal Header Tool生成的代码

namespace ElimChain // 命名空间定义
{
	UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_Lyra_Elimination_Message, "Lyra.Elimination.Message"); // 定义击杀消息的游戏标签
}

void UElimChainProcessor::StartListening() // 开始监听消息的函数实现
{
	UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this); // 获取游戏消息子系统实例
	AddListenerHandle(MessageSubsystem.RegisterListener(ElimChain::TAG_Lyra_Elimination_Message, this, &ThisClass::OnEliminationMessage)); // 注册击杀消息监听器
}

void UElimChainProcessor::OnEliminationMessage(FGameplayTag Channel, const FLyraVerbMessage& Payload) // 处理击杀消息的函数实现
{
	// 为攻击者追踪连续击杀链（除了自我击杀的情况）
	if (Payload.Instigator != Payload.Target) // 如果攻击者和目标不是同一个对象
	{
		if (APlayerState* InstigatorPS = Cast<APlayerState>(Payload.Instigator)) // 尝试将攻击者转换为玩家状态
		{
			const double CurrentTime = GetServerTime(); // 获取当前服务器时间

			FPlayerElimChainInfo& History = PlayerChainHistory.FindOrAdd(InstigatorPS); // 查找或添加玩家的击杀链记录
			const bool bStreakReset = (History.LastEliminationTime == 0.0) || (History.LastEliminationTime + ChainTimeLimit < CurrentTime); // 判断是否重置击杀链

			History.LastEliminationTime = CurrentTime; // 更新最后一次击杀时间
			if (bStreakReset) // 如果需要重置击杀链
			{
				History.ChainCounter = 1; // 重置连续击杀计数器
			}
			else // 如果不需要重置击杀链
			{
				++History.ChainCounter; // 增加连续击杀计数器

				if (FGameplayTag* pTag = ElimChainTags.Find(History.ChainCounter)) // 查找当前击杀次数对应的标签
				{
					FLyraVerbMessage ElimChainMessage; // 创建新的动词消息
					ElimChainMessage.Verb = *pTag; // 设置消息动词为找到的标签
					ElimChainMessage.Instigator = InstigatorPS; // 设置攻击者
					ElimChainMessage.InstigatorTags = Payload.InstigatorTags; // 设置攻击者标签
					ElimChainMessage.ContextTags = Payload.ContextTags; // 设置上下文标签
					ElimChainMessage.Magnitude = History.ChainCounter; // 设置连续击杀次数
					
					UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this); // 获取游戏消息子系统实例
					MessageSubsystem.BroadcastMessage(ElimChainMessage.Verb, ElimChainMessage); // 广播连续击杀消息
				}
			}
		}
	}
}